package com.gzz.socket.aio.time;

import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;

public class ServerAcceptCompletionHandler implements CompletionHandler<AsynchronousSocketChannel, AsyncTimeServerHandler> {

    @Override
    public void completed(AsynchronousSocketChannel channel, AsyncTimeServerHandler attachment) {
        // 从attachment获取成员变量asynchronousServerSocketChannel，然后调用它的accept方法
        // 既然已经是接收客户端成功，为什么还要再次调用accept方法呢
        // 原因是：调用asynchronousServerSocketChannel的accept的方法后，如果有新的客户端连接接入，系统将回调我们传入的CompletionHandler实例的completed方法，表示新的客户端已经接入成功。
        // 因为一个AsynchronousServerSocketChannel可以接收成千上万个客户端，所以需要继续调用它的accept方法。接收其他的客户端连接，最终成一个循环。每当接收一个客户端连接成功之后，再异步接收新的客户端连接。
        attachment.asynchronousServerSocketChannel.accept(attachment, this);
        // 链路建立成功之后，服务端需要接收客户端的请求消息。创建新的ByteBuffer,预分配1MB的缓冲区
        ByteBuffer buffer = ByteBuffer.allocate(1024);
//        调用AsynchonousSocketChannel的read方法进行异步读操作。
//        ByteBuffer dst: 接收缓冲区，用于从异步channel中读取数据包。
//        A attachment: 异步Channel携带附件，通知回调的时候作为入参使用；
//        CompletetionHandler<Integer, ? super A>: 接收通知回调的业务handler,

        channel.read(buffer, buffer, new ServerReadCompletionHandler(channel));
    }

    @Override
    public void failed(Throwable exc, AsyncTimeServerHandler attachment) {
        exc.printStackTrace();
        attachment.latch.countDown();
    }
}
